
const userModel = require('../model/user')

// 加密模块
const bcryptjs = require('bcryptjs');
// jwt
const jwt = require('jsonwebtoken');
// 配置模块
const config = require('../config/config')



// 用户注册
async function regCon(req, res, next) {
 
  let { username, password, email, age, gender } = req.body;

  let r1 = await userModel.findOne({ username,isShow:1})
  if (r1) return res.send({ code: 0, msg: '用户名已经被占用' })

  // 写入数据库---写入之前密码加密---使用第三方模块 bcryptjs
  // 密码加密---bcryptjs.hashSync(需要加密的数据,加密等级) ---返回加密好的数据
  // 解密校验---bcryptjs.compareSync(明文,密文)--- 返回布尔值
  let pwd = bcryptjs.hashSync(password, config.level);
  try {
    await userModel.insertMany({ username, password: pwd, email, age, gender });
    res.send({code:1,msg:'注册成功'});
  } catch (error) {
    res.send({code:0,msg:'用户注册失败'});
  }
}

// 用户登录
async function loginCon(req,res,next) {
  let {username,password} = req.body;
  let r1 = await userModel.findOne({username,isShow:1},{__v:0});
  if(!r1) return res.send({code:0,msg:'用户名不存在'});
  // 解密校验---bcryptjs.compareSync(明文,密文)--- 返回布尔值
  let r2 = bcryptjs.compareSync(password,r1.password);
  if(!r2) return res.send({code:0,msg:'用户名或密码错误'})
  // 用户名及密码校验通过
  // 生成token令牌
  let token = jwt.sign({userid: r1._id},config.salt,{expiresIn:config.expiresIn});
  res.send({code:1,msg:'登录成功',info:{username:r1.username,email:r1.email,age:r1.age,gender:r1.gender,id:r1._id},token})
}

// 获取用户详情
function getCon(req,res,next) {
  let {id} = req.params;
  let token = req.headers.authorization;
  jwt.verify(token,config.salt, async (err,data)=>{
    if(err) return res.send({code:0,msg:'token失效'});
    console.log( data )
    // 二次验证----token和用户一致
    if(id != data.userid) return res.send({code:0,msg:'token失效'});
    // 用户名和token正确
    let info = await userModel.findOne({_id:id},{__v:0,password:0})
    res.send({code:1,info,msg:'获取用户详情成功'});
  })
}



// 导出控制器
module.exports = {
  regCon,
  loginCon,
  getCon
}

// ! 此文件中不书写 用户相关的接口逻辑操作
// @ 操作数据表的Schema表及数据操作的模型----使用模型化
// # 创建一个modle文件夹---将用户表相关的模型写在该目录下